package main

import (
	"SearchEngine/inquire/initFiles"
	"SearchEngine/inquire/sortDocs"
	"SearchEngine/inquire/splitWords"
	"fmt"
)

// doc_id.bin：记录网页链接和编号之间的对应关系。
// term_id.bin：记录单词和编号之间的对应关系。
// index.bin：倒排索引文件，记录每个单词编号以及对应包含它的网页编号列表。
// term_offsert.bin：记录每个单词编号在倒排索引文件中的偏移位置。
func main() {
	//0.初始化，将三个文件都加载到内存中，并且组织成散列表
	initFiles.InitFiles()
	//1.获取用户在搜索框中，输入某个查询文本
	fmt.Println("已获取用户输入搜索词")
	QueryText := "深圳电影院"
	//2.对用户输入的文本进行分词处理，得到 k 个单词
	splitTerms := splitWords.GetSplitWords(QueryText)
	fmt.Println("分词处理：", splitTerms)
	//3.拿这 k 个单词，去 term_id.bin 对应的散列表中，查找对应的单词编号
	termIDs := getTermIDs(splitTerms)
	fmt.Println("对应的单词编号：", termIDs)
	//4.拿这 k 个单词编号，去 term_offset.bin 对应的散列表中，得到了 k 个偏移位置。
	// offsets := getOffsets(termIDs)
	//5.拿这 k 个偏移位置，去倒排索引（index.bin）中，得到了 N 个网页编号列表。
	docIDs := getDocIDs(termIDs)
	fmt.Println("网页编号列表：", docIDs)
	//6.针对这 N 个网页编号列表，统计每个网页编号出现的次数，按照出现次数的多少，从大到小排序，得到了一组排好序的网页编号。
	docIDs = sortDocs.SortDocs(docIDs)
	fmt.Println("排好序的网页编号:", docIDs)
	//7.我们拿着网页编号，去 doc_id.bin 文件中查找对应的网页链接
	docs := getDocs(docIDs)
	//8.对应的网页链接，分页显示给用户就可以了
	fmt.Println("用户搜索结果如下：")
	for _, doc := range docs {
		fmt.Println(doc)
	}
}

func getTermIDs(splitTerms []string) (termIDs []int64) {
	for _, term := range splitTerms {
		termIDs = append(termIDs, initFiles.HashTermID[term])
	}
	return
}

func getOffsets(termIDs []int64) (offsets []int64) {
	for _, termID := range termIDs {
		offsets = append(offsets, initFiles.HashTermIDOffset[termID])
	}
	return
}

func getDocIDs(termIDs []int64) (docIDs []int64) {
	for _, termID := range termIDs {
		for _, docID := range initFiles.HashTermIDDocIDs[termID] {
			docIDs = append(docIDs, docID)
		}
	}
	return
}

func getDocs(docIDs []int64) (docs []string) {
	for _, docID := range docIDs {
		docs = append(docs, initFiles.HashDocID[docID])
	}
	return
}
